const hasCircleRef = require("./template")

function testHasCircleRef() {
  // 1. 基本循环引用测试
  console.log(
    "1. 基本循环引用:",
    (() => {
      const obj = { a: 1, b: 2 }
      obj.b = obj
      return hasCircleRef(obj) === true
    })()
  )

  // 2. 无循环引用的简单对象
  console.log(
    "2. 无循环引用的简单对象:",
    (() => {
      const obj = { a: 1, b: 2, c: 3 }
      return hasCircleRef(obj) === false
    })()
  )

  // 3. 嵌套对象的循环引用
  console.log(
    "3. 嵌套对象的循环引用:",
    (() => {
      const obj = {
        a: { x: 1 },
        b: { y: 2 }
      }
      obj.a.ref = obj.b
      obj.b.ref = obj.a
      return hasCircleRef(obj) === true
    })()
  )

  // 4. 深层嵌套的循环引用
  console.log(
    "4. 深层嵌套的循环引用:",
    (() => {
      const obj = {
        level1: {
          level2: {
            level3: {}
          }
        }
      }
      obj.level1.level2.level3.ref = obj.level1
      return hasCircleRef(obj) === true
    })()
  )

  // 5. 数组中的循环引用
  console.log(
    "5. 数组中的循环引用:",
    (() => {
      const obj = { arr: [1, 2, 3] }
      obj.arr.push(obj)
      return hasCircleRef(obj) === true
    })()
  )

  // 6. 自引用（对象引用自己）
  console.log(
    "6. 自引用:",
    (() => {
      const obj = { name: "test" }
      obj.self = obj
      return hasCircleRef(obj) === true
    })()
  )

  // 7. 复杂对象的循环引用
  console.log(
    "7. 复杂对象的循环引用:",
    (() => {
      const obj = {
        user: { name: "Alice", age: 30 },
        company: { name: "TechCorp" },
        settings: { theme: "dark" }
      }
      obj.user.company = obj.company
      obj.company.owner = obj.user
      return hasCircleRef(obj) === true
    })()
  )

  // 8. 无循环引用的复杂嵌套对象
  console.log(
    "8. 无循环引用的复杂嵌套对象:",
    (() => {
      const obj = {
        user: { name: "Alice", age: 30 },
        company: { name: "TechCorp" },
        settings: { theme: "dark" },
        nested: {
          deep: {
            value: "test"
          }
        }
      }
      return hasCircleRef(obj) === false
    })()
  )

  // 9. 空对象
  console.log(
    "9. 空对象:",
    (() => {
      const obj = {}
      return hasCircleRef(obj) === false
    })()
  )

  // 10. 包含null和undefined的对象
  console.log(
    "10. 包含null和undefined的对象:",
    (() => {
      const obj = {
        a: null,
        b: undefined,
        c: { value: 1 }
      }
      return hasCircleRef(obj) === false
    })()
  )

  // 11. 函数和原始值的对象
  console.log(
    "11. 函数和原始值的对象:",
    (() => {
      const obj = {
        func: () => {},
        str: "hello",
        num: 42,
        bool: true
      }
      return hasCircleRef(obj) === false
    })()
  )

  // 12. 多重循环引用
  console.log(
    "12. 多重循环引用:",
    (() => {
      const obj = {
        a: { name: "A" },
        b: { name: "B" },
        c: { name: "C" }
      }
      obj.a.ref = obj.b
      obj.b.ref = obj.c
      obj.c.ref = obj.a
      return hasCircleRef(obj) === true
    })()
  )

  // 13. 数组嵌套对象的循环引用
  console.log(
    "13. 数组嵌套对象的循环引用:",
    (() => {
      const obj = {
        items: [
          { id: 1, name: "item1" },
          { id: 2, name: "item2" }
        ]
      }
      obj.items[0].parent = obj
      return hasCircleRef(obj) === true
    })()
  )

  // 14. 原型链上的循环引用
  console.log(
    "14. 原型链上的循环引用:",
    (() => {
      function Parent() {
        this.name = "parent"
      }
      function Child() {
        this.name = "child"
      }
      Child.prototype = new Parent()
      const child = new Child()
      child.parent = child
      return hasCircleRef(child) === true
    })()
  )

  // 15. 边界情况：对象属性值为对象但无循环
  console.log(
    "15. 边界情况：对象属性值为对象但无循环:",
    (() => {
      const shared = { value: "shared" }
      const obj = {
        a: shared,
        b: shared
      }
      return hasCircleRef(obj) === false
    })()
  )

  // 16. 你提到的场景：obj.b.c = obj.b
  console.log(
    "16. obj.b.c = obj.b 场景:",
    (() => {
      const obj = {
        a: {},
        b: {}
      }
      obj.b.c = obj.b
      return hasCircleRef(obj) === true
    })()
  )

  // 17. 类似场景：obj.a.d = obj.a
  console.log(
    "17. obj.a.d = obj.a 场景:",
    (() => {
      const obj = {
        a: {},
        b: {}
      }
      obj.a.d = obj.a
      return hasCircleRef(obj) === true
    })()
  )

  // 18. 深层嵌套的自引用
  console.log(
    "18. 深层嵌套的自引用:",
    (() => {
      const obj = {
        level1: {
          level2: {
            level3: {}
          }
        }
      }
      obj.level1.level2.level3.self = obj.level1.level2.level3
      return hasCircleRef(obj) === true
    })()
  )

  // 19. this上下文测试
  console.log(
    "19. this上下文测试:",
    (() => {
      const obj = {
        data: { a: 1, b: 2 },
        checkCircle: function() {
          return hasCircleRef(this.data)
        }
      }
      return obj.checkCircle() === false
    })()
  )

  // 20. 方法调用this绑定
  console.log(
    "20. 方法调用this绑定:",
    (() => {
      const obj = {
        items: [{ id: 1 }, { id: 2 }],
        createCircle: function() {
          this.items[0].ref = this.items[1]
          this.items[1].ref = this.items[0]
          return hasCircleRef(this.items)
        }
      }
      return obj.createCircle() === true
    })()
  )

  // 21. 复杂对象this绑定
  console.log(
    "21. 复杂对象this绑定:",
    (() => {
      const obj = {
        config: {
          user: { name: "Alice" },
          system: { version: "1.0" }
        },
        checkConfigCircle: function() {
          return hasCircleRef(this.config)
        }
      }
      return obj.checkConfigCircle() === false
    })()
  )

  // 22. 回调函数this绑定
  console.log(
    "22. 回调函数this绑定:",
    (() => {
      const obj = {
        namespace: "app",
        data: {
          user: { name: "Bob" },
          settings: {}
        },
        checkDataCircle: function() {
          return hasCircleRef(this.data)
        }
      }
      return obj.checkDataCircle() === false
    })()
  )
}

testHasCircleRef()
